| If we want to create a point from another point, hence, copying the properties of one object to a newly created one, we sometimes have to take care of the copy
| process. For example, consider the class List which allocates dynamically memory for its elements. If we want to create a second list which is a copy of the first, we
| must allocate memory and copy the individual elements.
| This type of constructor is so important that it has its own name: copy constructor. It is highly recommended that you provide for each of your classes such a
| constructor, even if it is as simple as in our example. The copy constructor is called in the following cases:
| Point apoint; // Point::Point()
| Point bpoint(apoint); // Point::Point(const Point &)
| Point cpoint = apoint; // Point::Point(const Point &)
| With help of constructors we have fulfilled one of our requirements of implementation of abstract data types: Initialization at definition time. We still need a
| mechanism which automatically “destroys'' an object when it gets invalid (for example, because of leaving its scope). Therefore, classes can define destructors.